/* 在main.c的合适位置添加以下代码 */

#include "stm32f1xx_hal.h"
#include "stdio.h"



// CAN消息结构体定义
CAN_TxHeaderTypeDef TxHeader;
CAN_RxHeaderTypeDef RxHeader;
uint8_t TxData[8];  // 发送数据缓冲区
uint8_t RxData[8];  // 接收数据缓冲区
uint32_t TxMailbox; // 发送邮箱

// 测试用数据
uint8_t testData[] = {0x12, 0x34, 0x56, 0x78, 0xAB, 0xCD, 0xEF, 0x99};

// 在main函数初始化后添加
int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_CAN_Init();
  
  // 启动CAN滤波器（回环模式下可配置为不过滤）
  CAN_FilterTypeDef canFilter;
  canFilter.FilterBank = 0;                    // 滤波器组0
  canFilter.FilterMode = CAN_FILTERMODE_IDMASK; // 掩码模式
  canFilter.FilterScale = CAN_FILTERSCALE_32BIT; // 32位模式
  canFilter.FilterIdHigh = 0x0000;             // ID高16位
  canFilter.FilterIdLow = 0x0000;              // ID低16位
  canFilter.FilterMaskIdHigh = 0x0000;         // 掩码高16位（全不过滤）
  canFilter.FilterMaskIdLow = 0x0000;          // 掩码低16位（全不过滤）
  canFilter.FilterFIFOAssignment = CAN_RX_FIFO0; // 分配到FIFO0
  canFilter.FilterActivation = ENABLE;         // 使能滤波器
  canFilter.SlaveStartFilterBank = 14;         // 从滤波器组
  
  HAL_CAN_ConfigFilter(&hcan, &canFilter);
  
  // 启动CAN
  HAL_CAN_Start(&hcan);
  
  // 启动CAN接收中断
  HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO0_MSG_PENDING);
  
  // 配置发送消息头
  TxHeader.DLC = 8;                            // 数据长度：8字节
  TxHeader.ExtId = 0x123;                      // 扩展ID
  TxHeader.IDE = CAN_ID_EXT;                   // 使用扩展ID
  TxHeader.RTR = CAN_RTR_DATA;                 // 数据帧
  TxHeader.TransmitGlobalTime = DISABLE;
  
  // 复制测试数据到发送缓冲区
  memcpy(TxData, testData, 8);
  
  while (1)
  {
    // 发送CAN消息
    if(HAL_CAN_AddTxMessage(&hcan, &TxHeader, TxData, &TxMailbox) == HAL_OK)
    {
      // 发送成功
      HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET); // 点亮LED（如有）
    }
    
    HAL_Delay(1000); // 每秒发送一次
    
    // 接收在中断中处理
  }
}

// CAN接收中断回调函数
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
  // 接收CAN消息
  if(HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxHeader, RxData) == HAL_OK)
  {
    // 接收成功处理
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); // 熄灭LED（如有）
    
    // 这里可以添加数据验证逻辑
    // 比较RxData和TxData是否一致
  }
}

// 错误处理回调
void HAL_CAN_ErrorCallback(CAN_HandleTypeDef *hcan)
{
  // 错误处理代码
  // 可以重置CAN或进行其他错误恢复操作
  }